package app

import (
	"blog_server/global"
	"blog_server/pkg/util"
	"github.com/dgrijalva/jwt-go"
	"time"
)

type Claims struct {
	AppKey string `json:"app_key"`
	AppSecret string `json:"app_secret"`
	jwt.StandardClaims // jwt-go 预定义字段
}

func GetJWTSecret() []byte {
	return []byte(global.JWTSetting.Secret) // 使用默认配置的密钥
}

// GenerateToken 根据客户端传入的Appkey AppSecret 生成签名后的token
func GenerateToken(appKey, appSecret string) (string, error) {
	nowTime := time.Now()
	expireTime := nowTime.Add(global.JWTSetting.Expire)
	claims := Claims{
		AppKey: util.EncodeMD5(appKey),
		AppSecret: util.EncodeMD5(appSecret),
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: expireTime.Unix(),
			Issuer: global.JWTSetting.Issuer,
		},
	}
	
	tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) // 创建token
	token, err := tokenClaims.SignedString(GetJWTSecret()) // 创建签名字符串
	return token, err
}

// ParseToken 解析校验token
func ParseToken(token string) (*Claims, error)  {
	tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) { // 解析鉴权声明
		return GetJWTSecret(), nil
	})
	if tokenClaims != nil {
		claims, ok := tokenClaims.Claims.(*Claims)
		if ok && tokenClaims.Valid { // Valid 验证基于时间的声明，如过期时间(expiresAt)、签发者(issuer)、生效时间（not before）
			return claims, err
		}
	}
	return nil, err
}


